package com.threeox.commonlibrary.inter;

import android.content.Context;
import android.view.View;

import com.threeox.commonlibrary.callback.CallBackMsg;
import com.threeox.commonlibrary.callback.CommonCallback;
import com.threeox.commonlibrary.entity.engine.request.base.BaseRequestMsg;
import com.threeox.commonlibrary.entity.engine.request.network.NetWorkRequestMsg;
import com.threeox.commonlibrary.ui.view.inter.reload.IReloadView;
import com.threeox.commonlibrary.ui.view.inter.table.ITablePagingView;
import com.threeox.commonlibrary.ui.view.inter.table.ITableView;
import com.threeox.commonlibrary.ui.view.inter.titlebar.ITitleBarView;
import com.threeox.commonlibrary.ui.view.loadview.ILoadDialog;
import com.threeox.commonlibrary.util.request.RequestHelper;
import com.threeox.httplibrary.builder.OkHttpRequestBuilder;

/**
 *
 * @ClassName: IOverallConfig
 *
 * @Description: Todo(全局的配置接口)
 *
 * @author 赵屈犇
 *
 * @date 创建时间:2017/4/29 上午11:30
 *
 * @version 1.0
 */
public interface IOverallConfig<T> extends OnHttpListener {

    /**
     * 初始化标题栏
     *
     * @param context
     * @return
     */
    ITitleBarView initTitleBarView(Context context);

    /**
     * 初始化各种状态的View
     *
     * @param context
     * @return
     */
    IReloadView initStatusView(Context context);

    /**
     * 初始化加载的Dialog
     *
     * @param context
     * @return
     */
    ILoadDialog initLoadDialog(Context context);

    /**
     * 初始化表View
     *
     * @param context
     * @return
     */
    ITableView initTableView(Context context);

    /**
     * 初始化表格分页View
     *
     * @param context
     * @return
     */
    ITablePagingView initTablePagingView(Context context);

    /**
     * 全局拦截并获取值
     *
     * @param view
     * @return
     */
    Object getViewVal(View view);

    /**
     * 全局拦截并设置值
     * @param view
     * @param val
     */
    void setViewValue(View view, Object val);

    /**
     * 全局拦截执行请求的回调
     *
     * @param requestHelper
     * @param requestMsg
     * @param requestType
     *
     * @throws Exception
     */
    void execRequest(RequestHelper requestHelper, BaseRequestMsg requestMsg, String requestType) throws Exception;

    /**
     * 拦截网络请求之前的回调
     *
     * @param requestMsg
     * @param requestBuilder
     */
    void onBeforeRequest(NetWorkRequestMsg requestMsg, OkHttpRequestBuilder requestBuilder);

    /**
     * 全局拦截请求成功回调
     *
     * @param message
     * @param id
     * @param url
     * @param callback
     * @return
     */
    boolean onInterceptRequestSuccess(String message, int id , String url, CommonCallback callback);

    /**
     * 全局拦截响应请求并返回对象
     *
     * @param url
     * @param id
     * @param message
     * @return  为null时不替换,不为null是就替换
     */
    Object onBeforeResponse(String url, int id, String message);

    /**
     * 全局拦截响应请求
     *
     * @param url
     * @param id
     * @param message
     * @param data  解析的数据
     * @param result   原数据没有处理过
     *
     * @return 为null时不替换,不为null是就替换
     */
    Object onAfterResponse(String url, int id, String message, Object data, Object result);


    /**
     * 全局拦截错误请求信息
     *
     * @param backMsg
     * @return
     */
    CallBackMsg onBeforeRequestError(CallBackMsg backMsg);

    /**
     * 全局拦截执行请求的回调
     *
     * @param requestHelper
     * @param requestMsg
     * @param requestType
     * @throws Exception
     *  void execRequest(RequestHelper requestHelper, RequestMsg requestMsg, String requestType) throws Exception;
     */

    /**
     * 在请求成功并且所有操作执行完毕调用
     *
     * @param url
     * @param id
     * @param msg
     * @param data
     */
    void onAfterSuccess(String url, int id, String msg, T data);

    /**
     * 在请求失败并且所有操作执行完毕调用
     *
     * @param url
     * @param id
     * @param code
     * @param msg
     */
    void onAfterError(String url, int id, Object code, String msg);

    /**
     * 在加载中...并且所有操作执行完毕调用
     *
     * @param progress
     * @param total
     * @param id
     * @param url
     */
    void afterInProgress(float progress, long total, int id, String url);

}
